5.16. Справочник по Pascal
Справочник по Pascal
Общая структура программы
Программа на Pascal состоит из заголовка, блока описаний и исполняемого блока.
program ИмяПрограммы;
{ Раздел описаний }
uses
Модуль1, Модуль2;
const
Константа1 = Значение1;
Константа2 = Значение2;
type
Тип1 = Определение1;
Тип2 = Определение2;
var
Переменная1: Тип1;
Переменная2: Тип2;
{ Подпрограммы }
procedure ИмяПроцедуры(Параметры);
begin
{ Тело процедуры }
end;
function ИмяФункции(Параметры): ТипРезультата;
begin
{ Тело функции }
ИмяФункции := Значение;
end;
{ Основной блок }
begin
{ Инструкции программы }
end.
Элементы структуры
program— объявляет имя программы. Необязательный элемент в некоторых диалектах.uses— подключает модули или библиотеки. Располагается сразу после заголовка.const— определяет именованные константы.type— определяет пользовательские типы данных.var— объявляет переменные.begin ... end.— основной исполняемый блок программы. Завершается точкой.
Комментарии
Pascal поддерживает два вида комментариев:
{ Это комментарий }(* Это тоже комментарий *)
Комментарии могут быть вложены в другие комментарии только в формате { }.
Типы данных
Простые (скалярные) типы
Целочисленные типы
| Тип | Диапазон значений | Размер (байт) |
|---|---|---|
ShortInt | -128 .. 127 | 1 |
Byte | 0 .. 255 | 1 |
SmallInt | -32768 .. 32767 | 2 |
Word | 0 .. 65535 | 2 |
Integer | -2147483648 .. 2147483647 | 4 |
LongInt | -2147483648 .. 2147483647 | 4 |
Cardinal | 0 .. 4294967295 | 4 |
Int64 | -2^63 .. 2^63 - 1 | 8 |
QWord | 0 .. 2^64 - 1 | 8 |
В классическом Pascal доступны только
Integer,Byte,Word,ShortInt,LongInt. Остальные — расширения Object Pascal.
Вещественные типы
| Тип | Диапазон | Значащие цифры | Размер (байт) |
|---|---|---|---|
Real | 2.9e-39 .. 1.7e38 | 11–12 | 6 |
Single | 1.5e-45 .. 3.4e38 | 7–8 | 4 |
Double | 5.0e-324 .. 1.7e308 | 15–16 | 8 |
Extended | 3.4e-4932 .. 1.1e4932 | 19–20 | 10 |
Comp | -2^63+1 .. 2^63-1 | 19–20 | 8 |
Currency | -922337203685477.5808 .. 922337203685477.5807 | 19–20 | 8 |
В Turbo Pascal основной тип —
Real. В современных реализациях чаще используютDouble.
Логический тип
Boolean— принимает значенияTrueилиFalse.- Размер: 1 байт.
- Также существуют
ByteBool,WordBool,LongBool— для совместимости с API.
Символьный тип
Char— один символ ASCII (0..255).- Размер: 1 байт.
- Для Unicode используется
WideChar(2 байта) в Object Pascal.
Перечислимые типы
Определяются явно:
type
Color = (Red, Green, Blue);
Season = (Winter, Spring, Summer, Autumn);
Значения упорядочены. К ним применимы функции Ord, Pred, Succ.
Интервальные (ограниченные) типы
type
Age = 0..120;
Digit = '0'..'9';
SmallIndex = 1..10;
Интервальные типы ограничивают допустимые значения базового типа.
Структурированные типы
Массивы (array)
Объявление:
var
A: array[1..10] of Integer;
B: array[0..99] of Real;
C: array['a'..'z'] of Char;
Многомерные массивы:
var
Matrix: array[1..5, 1..5] of Integer;
Cube: array[1..3, 1..3, 1..3] of Real;
Индексы могут быть любого порядкового типа (целые, перечислимые, символьные).
Строки (string)
- В классическом Pascal:
string[0..255]— ограниченная строка длиной до 255 символов. - Первый байт хранит длину строки.
- В Object Pascal:
AnsiString,UnicodeString,WideString,ShortString.
Пример:
var
S: string[20];
T: string; // неограниченная (в Object Pascal)
Операции:
Length(S)— длина строки.S[i]— i-й символ.+— конкатенация.Copy(S, start, count)— подстрока.Pos(sub, S)— позиция подстроки.Delete(S, index, count)— удаление.Insert(sub, S, index)— вставка.
Записи (record)
Группировка разнородных данных:
type
Person = record
Name: string[30];
Age: Integer;
Height: Real;
end;
var
P: Person;
Доступ к полям: P.Name, P.Age.
Вложенные записи:
type
Address = record
Street: string[50];
City: string[30];
end;
Employee = record
Info: Person;
WorkAddress: Address;
end;
Множества (set)
Коллекция значений порядкового типа (до 256 элементов):
type
CharSet = set of Char;
DigitSet = set of 0..9;
ColorSet = set of (Red, Green, Blue);
var
Vowels: CharSet;
Digits: DigitSet;
Операции:
+— объединение*— пересечение-— разностьin— проверка принадлежности
Пример:
Vowels := ['a', 'e', 'i', 'o', 'u'];
if 'a' in Vowels then ...
Файлы (file)
Типизированные файлы:
var
F: file of Integer;
Нетипизированные:
var
F: file;
Текстовые файлы:
var
F: text;
Операции:
Assign(F, 'filename.txt')— связывание с файломReset(F)— открытие для чтенияRewrite(F)— открытие для записиRead(F, x)/Write(F, x)Close(F)Eof(F)— признак конца файлаSeek(F, n)— позиционирование
Операторы
Присваивание
x := 5;
name := 'Alice';
Условные операторы
if
if условие then
оператор1
else
оператор2;
Блоки:
if x > 0 then
begin
WriteLn('Положительное');
x := x * 2;
end
else
WriteLn('Не положительное');
case
case Day of
1: WriteLn('Понедельник');
2: WriteLn('Вторник');
3..5: WriteLn('Рабочий день');
6, 7: WriteLn('Выходной');
else
WriteLn('Неверный день');
end;
Выражение в case должно быть порядкового типа.
Циклы
for
for i := 1 to 10 do
WriteLn(i);
for i := 10 downto 1 do
WriteLn(i);
Переменная цикла должна быть порядкового типа.
while
while x < 100 do
begin
x := x + 1;
WriteLn(x);
end;
repeat ... until
repeat
ReadLn(x);
until x > 0;
Тело выполняется хотя бы один раз.
Процедуры и функции
Объявление
procedure PrintMessage(Msg: string);
begin
WriteLn(Msg);
end;
function Square(x: Integer): Integer;
begin
Square := x * x;
end;
Параметры
- Значение (по умолчанию):
procedure P(x: Integer);— копия. - Переменная:
procedure P(var x: Integer);— передача по ссылке. - Константа:
procedure P(const s: string);— защита от изменения. - Открытые массивы (в Object Pascal):
procedure P(arr: array of Integer);
Рекурсия
function Factorial(n: Integer): Integer;
begin
if n = 0 then
Factorial := 1
else
Factorial := n * Factorial(n - 1);
end;
Встроенные функции и процедуры
Математические
Abs(x)— модульSqr(x)— квадратSqrt(x)— квадратный кореньSin(x),Cos(x),Arctan(x)Exp(x)— e^xLn(x)— натуральный логарифмTrunc(x)— целая часть (вещественное → целое)Round(x)— округлениеFrac(x)— дробная частьInt(x)— целая часть как вещественное число
Работа с типами
Ord(x)— порядковый номер (для порядковых типов)Chr(n)— символ по кодуPred(x),Succ(x)— предыдущее/следующее значениеHigh(x),Low(x)— верхняя/нижняя граница типа или массива
Работа со строками
Length(s)Copy(s, i, n)Pos(sub, s)Concat(s1, s2, ...)UpCase(c)— преобразует символ в верхний регистр (только латиница)
Работа с файлами
Assign(f, name)Reset(f),Rewrite(f),Append(f)Close(f)Eof(f),Eoln(f)Read(f, x),ReadLn(f, x)Write(f, x),WriteLn(f, x)Seek(f, n),FileSize(f),FilePos(f)
Преобразования
Str(x, s)— число → строкаVal(s, x, code)— строка → число (code = 0при успехе)
Управление памятью (динамические структуры)
В классическом Pascal динамическое выделение ограничено указателями и записями.
type
PNode = ^TNode;
TNode = record
Data: Integer;
Next: PNode;
end;
var
P: PNode;
begin
New(P); // выделение памяти
P^.Data := 42;
Dispose(P); // освобождение
end;
Указатели:
^— разыменование@— взятие адреса
Модули
Модуль — автономная единица кода, содержащая объявления типов, констант, переменных, процедур и функций, которые можно использовать в других программах или модулях.
Структура модуля
unit ИмяМодуля;
interface
{ Объявления, доступные другим модулям }
uses
ДругойМодуль1, ДругойМодуль2;
const
PI = 3.14159;
type
TPoint = record
X, Y: Real;
end;
procedure DrawLine(P1, P2: TPoint);
function Distance(P1, P2: TPoint): Real;
implementation
{ Реализация процедур и функций }
procedure DrawLine(P1, P2: TPoint);
begin
{ ... }
end;
function Distance(P1, P2: TPoint): Real;
begin
Distance := Sqrt(Sqr(P2.X - P1.X) + Sqr(P2.Y - P1.Y));
end;
initialization
{ Код, выполняемый при загрузке модуля }
finalization
{ Код, выполняемый при выгрузке модуля }
end.
Разделы модуля
interface— публичный интерфейс. Всё, что объявлено здесь, видно извне.implementation— реализация. Здесь пишутся тела процедур и функций.initialization— необязательный блок, выполняется один раз при подключении модуля.finalization— необязательный блок, выполняется при завершении программы.
Подключение модулей
В программе:
program Test;
uses
Crt, Graph, MyUtils;
begin
{ ... }
end.
Порядок в uses важен: если модуль A использует модуль B, то B должен быть указан до A или в его interface-разделе.
Директивы компилятора
Директивы управляют поведением компилятора. Они заключаются в фигурные скобки с символом $.
Часто используемые директивы
| Директива | Назначение |
|---|---|
{$APPTYPE CONSOLE} | Указывает, что приложение — консольное (Object Pascal) |
{$R+} / {$R-} | Включает/отключает проверку диапазонов массивов |
{$Q+} / {$Q-} | Включает/отключает проверку переполнения целых |
{$I+} / {$I-} | Включает/отключает проверку ввода-вывода |
{$G+} | Включает 32-битный код (Turbo Pascal) |
{$M min, max} | Устанавливает размер стека и кучи |
{$DEFINE DEBUG} | Определяет условный символ |
{$IFDEF DEBUG} ... {$ENDIF} | Условная компиляция |
Пример условной компиляции:
{$IFDEF DEBUG}
WriteLn('Отладочная информация');
{$ENDIF}
Обработка ошибок
Классический Pascal не имеет встроенной системы исключений. Обработка ошибок осуществляется через:
- Проверку кодов возврата (например,
IOResultпосле операций ввода-вывода) - Использование
{$I-}и последующую проверкуIOResult
Пример:
{$I-}
Assign(F, 'data.txt');
Reset(F);
{$I+}
if IOResult <> 0 then
WriteLn('Ошибка открытия файла')
else
begin
{ работа с файлом }
Close(F);
end;
В Object Pascal (Delphi, Free Pascal) доступна полноценная обработка исключений через
try ... exceptиtry ... finally.
Сравнение реализаций Pascal
| Характеристика | Turbo Pascal (1980–1990) | Free Pascal | Delphi (Object Pascal) |
|---|---|---|---|
| Поддержка ООП | Нет | Да | Полная |
| Исключения | Нет | Да | Да |
| Unicode | Нет | Ограниченная | Полная |
| Многопоточность | Нет | Через API | Да |
| GUI-библиотеки | BGI (графика) | LCL | VCL / FireMonkey |
| Совместимость с C | Низкая | Высокая | Средняя |
| Активная разработка | Прекращена | Да | Да |
Для учебных целей часто используется Free Pascal с IDE Lazarus, так как он бесплатен, кроссплатформен и совместим с Turbo Pascal на уровне базового синтаксиса.
Примеры использования
Пример 1: Работа с массивом
program ArrayExample;
var
A: array[1..5] of Integer;
i, Sum: Integer;
begin
for i := 1 to 5 do
A[i] := i * i;
Sum := 0;
for i := 1 to 5 do
Sum := Sum + A[i];
WriteLn('Сумма квадратов: ', Sum);
end.
Пример 2: Рекурсия — вычисление НОД
function GCD(a, b: Integer): Integer;
begin
if b = 0 then
GCD := a
else
GCD := GCD(b, a mod b);
end;
Пример 3: Запись и файл
type
TStudent = record
Name: string[30];
Score: Integer;
end;
var
F: file of TStudent;
S: TStudent;
begin
Assign(F, 'students.dat');
Rewrite(F);
S.Name := 'Иванов';
S.Score := 85;
Write(F, S);
Close(F);
end.
Советы по стилю и читаемости
- Используйте осмысленные имена переменных:
Counter,TotalPrice, а неi,x. - Разделяйте логические блоки пустыми строками.
- Комментируйте сложные алгоритмы.
- Объявляйте одну переменную на строку.
- Выравнивайте
begin/endвертикально. - Избегайте глубокой вложенности — выносите логику в процедуры.
- Используйте константы вместо магических чисел:
MaxStudents = 100; - При работе со строками проверяйте длину перед доступом к символам.
Специфические особенности
Порядковые типы
Любой тип, значения которого можно пронумеровать целыми числами, называется порядковым. К ним относятся:
- Все целочисленные типы
BooleanChar- Перечислимые типы
- Интервальные типы
К порядковым типам применимы функции:
Ord(x)Pred(x)Succ(x)Low(T)High(T)
Совместимость типов
Pascal строго типизирован. Присваивание возможно только между совместимыми типами. Например:
var
a: Integer;
b: Real;
begin
a := 5;
b := a; // допустимо: Integer → Real
a := b; // ошибка: Real → Integer без явного преобразования
a := Trunc(b); // правильно
end;
Явное преобразование типов осуществляется через функции (Trunc, Round) или приведение указателей (в продвинутых случаях).
Зарезервированные слова
Полный список ключевых слов Pascal (базовый набор):
and, array, begin, case, const, div, do, downto, else, end,
file, for, function, goto, if, in, label, mod, nil, not, of,
or, packed, procedure, program, record, repeat, set, then,
to, type, until, var, while, with
В Object Pascal добавляются:
class, constructor, destructor, inherited, override, virtual,
property, published, try, except, finally, raise, and many more
Ограничения классического Pascal
- Максимальная длина строки — 255 символов.
- Массивы имеют фиксированный размер на этапе компиляции.
- Нет динамических массивов (в классическом варианте).
- Нет встроенной поддержки строковых операций вроде
ToLower. - Нет многопоточности.
- Нет исключений.
- Нет пространств имён.
Эти ограничения снимаются в современных реализациях (Free Pascal, Delphi).